package com.tarena.emqx.consumer;

import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallbackExtended;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;

//这个回调对象 不需要在spring中创建bean 因为他是由client底层emqx连接调用时创建的
//只需要完成这个回调的逻辑
//可以从这个消费者看到MQTT协议的一些特点. 物联网连接 网络稳定性 不如服务器 通信
@Slf4j
public class MyConsumer implements MqttCallbackExtended {
    private MqttClient mqttClient;
    //构造方法传递 spring框架里的client对象
    public MyConsumer(MqttClient mqttClient){
        this.mqttClient=mqttClient;
    }
    //连接成功 消费者 底层连接通知 成功的时候调用
    @Override public void connectComplete(boolean reconnect, String serverURI) {
        log.info("consumer#connectComplete方法调用,连接成功,reconnect:{},serverURI:{}",reconnect,serverURI);
        //调用客户端mqttclient 订阅主题
        try{
            mqttClient.subscribe("demo02-topic");
        }catch (MqttException e){
            log.error("连接断开,订阅主题失败",e);
        }

    }
    //连接丢失 当底层连接 与设备断开的时候 会调用这个方法
    @Override public void connectionLost(Throwable cause) {
        log.info("consumer#connectionLost方法调用,连接断开",cause);
    }
    //消费者关心的是 底层连接成功时 消息是否可以到达消费者 进行消费
    //消费逻辑核心方法 处理消费消息
    @Override public void messageArrived(String topic, MqttMessage message) throws Exception {
        //消费逻辑
        log.info("执行消费业务逻辑...");
        log.info("消费者接收到消息:{},订阅主题:{}",message.toString(),topic);
    }
    //投递结束 消息消费完毕
    @Override public void deliveryComplete(IMqttDeliveryToken token) {
        log.info("consumer#deliveryComplete方法调用,消息token:{}",token);
    }
}
